//服务端代码，用于读取数据
#include "Comm.hpp"
#include "Fifo.hpp"
#include <unistd.h>

int main()
{
    //十六位进制的方式获取key
    key_t key = GetShmKeyOrDie();
    cout << "key: " << ToHex(key) << endl;

    //创建共享内存，已存在时再次创建会报错
    int shmid = CreateShm(key, defaultsize);
    cout << "shmid: " << shmid << endl;

    //输出该共享内存的一些属性信息
    ShmDebug(shmid);

    //将共享内存和进程进行挂接(关联)
    char* addr = (char*)ShmAttach(shmid);
    cout << "Attach shm success, addr: " << ToHex((uint64_t)addr) << endl;

    //先创建管道
    Fifo fifo;
    //然后再以读的方式打开管道文件
    Sync syn;
    syn.OpenReadOrDie();

    //服务端通信，开始往客户端中读取数据
    for(;;)
    {
        //读取数据时，要等待写入数据后才能被读取，若不写入，这里将一直阻塞等待
        if(!syn.Wait()) 
        {
            break;
        }
        cout << "shm content: " << addr << endl;
    }

    //将共享内存与进程分离
    ShmDetach(addr);
    cout << "Detach shm success, addr: " << ToHex((uint64_t)addr) << endl;

    //删除共享内存
    DeleteShm(shmid);

    return 0;
}